#!/usr/bin/env node

// 简单的GPIO测试 - 验证硬件连接
const { exec } = require('child_process');
const { promisify } = require('util');
const execAsync = promisify(exec);

console.log("开始基本GPIO测试...");

async function sleep(ms) {
  return new Promise(resolve => setTimeout(resolve, ms));
}

async function testGPIO() {
  try {
    console.log("🔧 使用gpio命令行工具测试引脚...");
    
    const testPins = [13, 12];
    
    for (const pin of testPins) {
      console.log(`\n📍 测试引脚 ${pin}:`);
      
      try {
        // 设置为输出模式
        await execAsync(`gpio -g mode ${pin} out`);
        console.log(`  ✅ 引脚${pin}设置为输出模式`);
        
        // 测试高低电平切换
        for (let i = 0; i < 5; i++) {
          await execAsync(`gpio -g write ${pin} 1`);
          console.log(`  ⚡ 引脚${pin} -> HIGH`);
          await sleep(500);
          
          await execAsync(`gpio -g write ${pin} 0`);
          console.log(`  ⚡ 引脚${pin} -> LOW`);
          await sleep(500);
        }
        
        console.log(`  ✅ 引脚${pin}基本IO测试完成`);
        
      } catch (error) {
        console.error(`  ❌ 引脚${pin}测试失败:`, error.message);
      }
    }
    
    console.log("\n📡 开始舵机PWM信号测试...");
    
    // 使用servo命令（如果可用）
    const pin = 13;
    
    try {
      // 设置舵机模式
      await execAsync(`gpio -g mode ${pin} pwm`);
      console.log(`✅ 引脚${pin}设置为PWM模式`);
      
      // 设置PWM频率（50Hz用于舵机）
      await execAsync(`gpio pwm-ms`);
      await execAsync(`gpio pwmc 384`); // 设置时钟分频
      await execAsync(`gpio pwmr 1000`); // 设置范围
      
      console.log("✅ PWM参数设置完成");
      
      // 测试不同的PWM值
      const testValues = [
        { name: "最小位置", value: 50 },   // ~1ms
        { name: "中性位置", value: 75 },   // ~1.5ms  
        { name: "最大位置", value: 100 },  // ~2ms
        { name: "回到中性", value: 75 }
      ];
      
      for (const test of testValues) {
        console.log(`\n🎯 设置${test.name}: PWM值 ${test.value}`);
        await execAsync(`gpio -g pwm ${pin} ${test.value}`);
        await sleep(2000);
      }
      
      // 停止PWM
      await execAsync(`gpio -g pwm ${pin} 0`);
      console.log("🛑 PWM信号已停止");
      
    } catch (pwmError) {
      console.log("ℹ️  PWM模式不可用，尝试软件PWM...");
      
      // 使用软件PWM方式
      for (let cycle = 0; cycle < 100; cycle++) {
        await execAsync(`gpio -g write ${pin} 1`);
        await sleep(1.5); // 1.5ms高电平
        await execAsync(`gpio -g write ${pin} 0`);
        await sleep(18.5); // 18.5ms低电平（总周期20ms = 50Hz）
      }
      
      console.log("✅ 软件PWM测试完成");
    }
    
    console.log("\n✅ 所有测试完成！");
    console.log("\n🔍 观察结果:");
    console.log("1. 如果连接了LED，应该能看到闪烁");
    console.log("2. 如果连接了舵机/电调，应该能听到响应声音或看到运动");
    console.log("3. 如果没有反应，检查:");
    console.log("   - 硬件连接是否正确");
    console.log("   - 电源供应是否充足");
    console.log("   - 引脚是否被其他程序占用");
    
  } catch (error) {
    console.error("❌ GPIO测试失败:", error.message);
    console.log("\n可能的原因:");
    console.log("1. 需要root权限运行");
    console.log("2. gpio命令未安装: sudo apt install wiringpi");
    console.log("3. GPIO引脚被其他程序占用");
  }
}

testGPIO();